/**
 * 用户权限状态的管理
 */

import {defineStore} from 'pinia'
import {httpRequest}  from '@/service/http.js' 
import handleModule from '@/common/handle-module'; // 处理路由、侧边栏的公共函数  
import permissionRouter from '@/routes/router'; // 需要权限的路由配置
import router, { dynamicRoutes, adminRoutes } from '@/routes/index'; // 默认路由配置，动态路由配置
//通过token信息查看用户的信息与权限,封装成一个promise, httpRequest.getUserByToken是写死的
const getUserByToken =()=>new Promise((resolve)=>{
        let token = {token : sessionStorage.getItem('token')};
        httpRequest.getUserByToken(token,()=>{},()=>{}).then((data)=>{
            console.log(`根据token${token}换取用户信息${data.data}`)
            resolve(data.data)
        },()=>{
            sessionStorage.removeItem('token');
            window.location.reload();
        }
    )
    }
)


export const usePermissionStore = defineStore('permission',{
    state:()=>({
        permissionList:null,//存放所有路由:静态路由+动态路由
        sidebarMenu:[],//导航栏菜单
        systemplate:'',//当前用户系统模板,不同系统模板对应不同的菜单栏
        isAdmin:false,//是否是管理员
        userPopedoms:[],//所有的路由权限模块,这个是后端返回的权限列表
        secondMenu:[],//二级菜单
    }),
    actions:{
/** ---------设置state状态--------start */
        setPermissionList(permissionList){
            this.permissionList = permissionList
        },
        setSidebarMenu(sidebarMenu){
            this.sidebarMenu = sidebarMenu 
        },
        setSystemplate(systemplate){
            this.systemplate = systemplate
        },
        setIsAdmin(isAdmin){
            this.isAdmin = isAdmin
        },
        setUserPopedoms(userPopedoms){
            this.userPopedoms = userPopedoms
        },
        setSecondMenu(secondMenu){
            this.secondMenu = secondMenu
        },
/** ---------设置state状态--------end */
 
/** ---------业务逻辑--------start */
//初始化路由表,每次router.beforeEach路由拦截时都要执行,确保路由和权限都是最新的

    async FETCH_PERMISSION(){
        this.permissionList = [];//初始化路由表,防止重复添加路由
        let data = await getUserByToken();//发请求获取到后端返回的用户信息
       let userPopedoms = data?.userPopedoms || []  //所有的路由权限模块
       console.log('请求后返回最原始的后端权限',userPopedoms)
    //    sessionStorage.setItem('userName',data.userName)//在session中设置用户名
    //    //判断用户是否是管理员,管理员有用户管理的菜单模块 
    //    this.isAdmin = userPopedoms?.find((item)=>item.requestMapping === 'user-manage');
    //    //保存用户的权限模块（去除掉用户管理和登录），获取展示菜单列表
       let userPopeList = userPopedoms.filter((v)=>v.requestMapping !== 'user-manage' && v.requestMapping !== 'login' && v.requestMapping !== 'safe-setting');
         this.userPopedoms =  userPopeList //将仓库中的路由权限状态改成后端返回并自己过滤后的数组,这个后面用作菜单栏业务
         let permissionList = userPopedoms
         console.log('过滤后存在状态中的菜单展示列表',this.userPopedoms)
    //    // 根据权限筛选出我们设置好的路由并加入到 path='/' 的children，用来合成最终的路由表
         let routes = handleModule.getRouter(permissionList, permissionRouter[0].children);
         let homeContainer = dynamicRoutes.find((v) => v.path === '/');
         console.log('routes',routes,'homeContainer',homeContainer)

    //      //这里是引用关系,将根据权限生成的路由加载到动态路由的home下
         homeContainer.children =  routes.concat(homeContainer.children);
   
    //      // 设置首页重定向，重定向到用户权限的第0项
         homeContainer.redirect = homeContainer.children[0].name;
         console.log('homeContainer.redirect',homeContainer.redirect)

    //      //根据权限生成左侧导航栏,返回的是由{name:'',title:'',children:[]}组成的数组
         this.sidebarMenu = handleModule.getSidebarMenu(userPopeList);
         console.log('生成的左侧菜单栏sidebarMenu',this.sidebarMenu)
    //     // 初始路由,不需要权限则可以进去的路由
        let initialRoutes = router.options.routes;
        console.log('初始路由initialRoutes',initialRoutes)
    //     // 动态添加路由。只有刷新页面才会清空动态添加的路由信息
        dynamicRoutes.forEach(route => router.addRoute(route));
        this.permissionList= [...initialRoutes, ...dynamicRoutes] //用户的所有路由
        console.log('最终所有路由permissionList',permissionList)
    }



/** ---------业务逻辑--------end */       
    },
    getters:{

    }
})

